Google FCM 离线推送简明教程 您所在的位置:网站首页 FCM推送 用户不在线 服务器会保留多长时间 Google FCM 离线推送简明教程

Google FCM 离线推送简明教程

2023-07-27 04:58| 来源: 网络整理| 查看: 265

FCM,即Firebase Cloud Messaging

Firebase,Firebase是一家实时后端数据库创业公司,它能帮助开发者很快的写出Web端和移动端的应用。自2014年10月Google收购Firebase以来,用户可以在更方便地使用Firebase的同时,结合Google的云服务。

Google在今天2016的I/O大会上发表新版Firebase,Firebase是专为行动应用开发者所提供的后端服务平台(Backend as a Services,BaaS)。新版Firebase增加了免费的数据分析工具、云端讯息推播、通知系统、当机报告、远端配置及动态连结等功能,是继2014年10月Google收购Firebase后,18个月以来的一次大改版。

Android Studio2.2中开始支持Firebase服务,如AdMob、分析、认证和通知等。

一、FCM初认识

我们知道,当我们应用被强杀之后,基本上就是收不到推送消息啦,或者说叫离线推送。不管是极光,腾讯信鸽还是阿里推送等,都是基本上对强杀无解,虽然第三方推送有各种奇技淫巧,但是只是杯水车薪。

而iOS在离线消息十分靠谱,那是因为每一个苹果可以通过自家服务器维持一个长链接,每一个iOS的推送都必须和苹果打交道,所以这个过程控制得很好。

Google的自己也是维护一套推送系统,境外开发者基本推送走的是Google的服务,但是由于哈哈哈哈的关系,在国内我们无法使用Google的服务,收不到Google的推送,也因此特殊环境下第三方推送群起,但是强杀之后收到离线消息依然弱爆,除了Google。

Google以前的推送叫GCM,后来收购FireBase退出的FCM是GCM的升级版,本质用的还是GCM.

GCM (Google Cloud Message for Android)是Google发布的Android服务器推送(push)技术。 FCM是谷歌推出的最新的Android系统级别的消息推送服务(用来替换GCM)。 二、接入FCM 二.1、前提

想要使用FCM,需要满足如下几个条件

设备必须是android4.0以上,Google Play Services 必须是 11.2.0以上版本 Android SDK Manager 必须有Google Play services SDK Android Studio必须是1.5以上版本

其中的难处,就是用户手机必须可以连得上Google Play Services ,这个问题嘛,交给历史,如果你的app是面向境外的,那么一切是如此地丝滑。

二.2、 接入

什么都别说啦,赶紧看一下Firebase FCM接入文档

本文是按照文档接入测试的,你可以自己去看啊,没错啊,到这里你就可以选择关闭页面,如果你愿意看,那么,continue。

二.2.1、在Firebase控制台添加自己的应用

首先你得有一个Google账号嘛,然后登录Firebase的控制台

创建应用 image.png

. 选择添加到安卓应用

image.png

.

下载生成的文件名为 “google-services.json”的文件,放在应用级别的文件目录下

image.png

.

image.png

期间有个添加包名和sha-1值的过程,此时添加的是debug的sha-1,最好在添加完成之后进入设置把release的sha-1值也添加进去。然后重新下载更新的“google-services.json”,重新替换到项目里面。

.

二.2.2、添加使用Firebase SDK

以当前工程没使用过Google Services为例子 需要在工程级gradle文件和应用级的gradle文件上操作。

添加SDK

项目gradle

buildscript → dependencies classpath 'com.google.gms:google-services:3.1.0' (最新版本可根据官网文档)

allprojects → repositories maven { url 'https://maven.google.com' }

这点官网无涉及,但是没加可能会报异常 Failed to resolve: com.google.firebase:firebase-messaging:11.2.0

image.png

. .

应用gradle

dependencies compile 'com.google.firebase:firebase-messaging:11.2.0' compile 'com.google.gms:google-services:3.1.0'

.

在文件的最后添加 apply plugin: 'com.google.gms.google-services'

这样代码不要有洁癖放在顶部,想着所有的apply plugin都放一起,不然很大可能报大概如下错误

Please fix the version conflict either by updating the version of the google-services plugin (information about the latest version is available at https://bintray.com/android/android-tools/com.google.gms.google-services/) or updating the version of com.google.android.gms to 9.0.0.

.

image.png

题外话 如果同时也引入google map,firebase的版本要一致,比如如下

// 下方的firebase-messaging 和 play-services-maps 和 play-services版本号必须一致 compile 'com.google.firebase:firebase-messaging:11.2.0' compile 'com.google.android.gms:play-services-maps:11.2.0' compile 'com.google.android.gms:play-services:11.2.0'// 添加之 compile 'com.google.gms:google-services:3.1.0' 配置FireBase SDK

唯一Token的获取和上传 最初启动您的应用时,FCM SDK 会为客户端应用实例生成一个注册令牌。如果您希望定位单台设备或创建设备组,则需要通过继承 FirebaseInstanceIdService 来访问此令牌。

当您需要检索当前令牌时,请调用 FirebaseInstanceId.getInstance().getToken() 如果令牌尚未生成,此方法将返回 null。

. . 消息的接收监听

MyFirebaseMessagingService /** * User: LJM * Date&Time: 2017-08-25 & 10:50 * Describe: 消息接收服务 * 推送分为 dataMessage和notification 两种 */ public class MyFirebaseMessagingService extends FirebaseMessagingService { private static final String TAG = "FBTEST"; @Override public void onMessageReceived(RemoteMessage remoteMessage) { super.onMessageReceived(remoteMessage); Log.d(TAG, "收到推送 From: " + remoteMessage.getFrom()); // Check if message contains a data payload. if (remoteMessage.getData().size() > 0) { Log.d(TAG, "收到推送 Message data payload: " + remoteMessage.getData()); } // Check if message contains a notification payload. if (remoteMessage.getNotification() != null) { Log.d(TAG, "收到通知 Message Notification Body: " + remoteMessage.getNotification().getBody()); } } }

. . token变化的监听

MyFirebaseInstanceIDService /** * User: LJM * Date&Time: 2017-08-25 & 10:48 * Describe: 实例化令牌服务 * 处理创建,轮询更新Token,当我们推送到执行设备或者设备组的时候就需要用到这个 */ public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService { private static final String TAG = "FBTEST"; @Override public void onTokenRefresh() { super.onTokenRefresh(); String refreshedToken = FirebaseInstanceId.getInstance().getToken(); Log.d(TAG, "刷新Token Refreshed token: " + refreshedToken); // If you want to send messages to this application instance or // manage this apps subscriptions on the server side, send the // Instance ID token to your app server. sendRegistrationToServer(refreshedToken); } /** * Persist token to third-party servers. * * Modify this method to associate the user's FCM InstanceID token with any server-side account * maintained by your application. * * @param token The new token. */ private void sendRegistrationToServer(String token) { // TODO: Implement this method to send token to your app server. } }

注册令牌可能会在发生下列情况时更改:

应用删除实例 ID 应用在新设备上恢复 用户卸载/重新安装应用 用户清除应用数据。

所以Firebase强烈建议我们复写onTokenRefresh方法并且及时上传更新的Token通知自家服务器

注册service .清单文件注册service

. . 至此,配置完成,就等着接消息啦。

三、接收推送

控制台发消息,只可以发Notification,但是也足够我们测试啦 (dataMessage必须服务器代码发)

控制台

.

image.png

发送即可收到。

对于 Notification,当app处于前台的是不会接收,至于当app处于后台或者被强杀时收到,嗯,强杀后能收到。而dataMessage是前后台都能收到。

经测试,Pixel 运行Oreo 完美接收,但是如果是其他厂商的机型,想要强杀后继续收到离线消息,一般需要在设置一下

小米【MIUI】

自启动管理:需要把应用加到【自启动管理】列表,否则杀进程或重新开机后进程无法开启 通知栏设置:应用默认都是显示通知栏通知,如果关闭,则收到通知也不会提示 网络助手:可以手动禁止已安装的第三方程序访问2G/3G和WIFI的网络和设置以后新安装程序是否允许访问2G/3G和WIFI的网络 MIUI 7 神隐模式: 允许应用进行自定义配置模式,应用在后台保持联网可用,否则应用进入后台时,应用无法正常接收消息。【设置】下电量和性能中【神隐模式】

华为【Emotion】

自启动管理:需要把应用加到【自启动管理】列表,否则杀进程或重新开机后进程不会开启,只能手动开启应用 后台应用保护:需要手动把应用加到此列表,否则设备进入睡眠后会自动杀掉应用进程,只有手动开启应用才能恢复运行 通知管理:应用状态有三种:提示、允许、禁止。禁止应用则通知栏不会有任何提醒

魅族【Flyme】

自启动管理:需要把应用加到【自启动管理】列表,否则杀进程或重新开机后进程无法开启 通知栏推送:关闭应用通知则收到消息不会有任何展示 省电管理: 安全中心里设置省电模式,在【待机耗电管理】中允许应用待机时,保持允许,否则手机休眠或者应用闲置一段时间,无法正常接收消息。

VIVO【Funtouch OS】

内存一键清理:需要将应用加入【白名单】列表,否则系统自带的“一键加速”,会杀掉进程 自启动管理:需要将应用加入“i管家”中的【自启动管理】列表,否则重启手机后进程不会自启。但强制手动杀进程,即使加了这个列表中,后续进程也无法自启动。

OPPO【ColorOS】

冻结应用管理:需要将应用加入纯净后台,否则锁屏状态下无法及时收到消息 自启动管理:将应用加入【自启动管理】列表的同时,还需要到设置-应用程序-正在运行里锁定应用进程,否则杀进程或者开机后进程不会开启,只能手动开启应用

三星

内存一键优化:需要将应用加入【白名单】列表,否则系统内存优化后,会杀掉应用进程

小米【MIUI】

自启动管理:需要把应用加到【自启动管理】列表,否则杀进程或重新开机后进程无法开启 通知栏设置:应用默认都是显示通知栏通知,如果关闭,则收到通知也不会提示 网络助手:可以手动禁止已安装的第三方程序访问2G/3G和WIFI的网络和设置以后新安装程序是否允许访问2G/3G和WIFI的网络 MIUI 7 神隐模式: 允许应用进行自定义配置模式,应用在后台保持联网可用,否则应用进入后台时,应用无法正常接收消息。【设置】下电量和性能中【神隐模式】

华为【Emotion】

自启动管理:需要把应用加到【自启动管理】列表,否则杀进程或重新开机后进程不会开启,只能手动开启应用 后台应用保护:需要手动把应用加到此列表,否则设备进入睡眠后会自动杀掉应用进程,只有手动开启应用才能恢复运行 通知管理:应用状态有三种:提示、允许、禁止。禁止应用则通知栏不会有任何提醒

魅族【Flyme】

自启动管理:需要把应用加到【自启动管理】列表,否则杀进程或重新开机后进程无法开启 通知栏推送:关闭应用通知则收到消息不会有任何展示 省电管理: 安全中心里设置省电模式,在【待机耗电管理】中允许应用待机时,保持允许,否则手机休眠或者应用闲置一段时间,无法正常接收消息。

VIVO【Funtouch OS】

内存一键清理:需要将应用加入【白名单】列表,否则系统自带的“一键加速”,会杀掉进程 自启动管理:需要将应用加入“i管家”中的【自启动管理】列表,否则重启手机后进程不会自启。但强制手动杀进程,即使加了这个列表中,后续进程也无法自启动。

OPPO【ColorOS】

冻结应用管理:需要将应用加入纯净后台,否则锁屏状态下无法及时收到消息 自启动管理:将应用加入【自启动管理】列表的同时,还需要到设置-应用程序-正在运行里锁定应用进程,否则杀进程或者开机后进程不会开启,只能手动开启应用

三星

内存一键优化:需要将应用加入【白名单】列表,否则系统内存优化后,会杀掉应用进程

设置方式引自极光推送文档,侵删

对应设置后,华为荣耀7,P9,�三星等均能接收离线消息。

四、服务器

参见文档

end



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有